{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19",
    "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5",
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:13.115129Z",
     "iopub.status.busy": "2023-10-31T13:08:13.114473Z",
     "iopub.status.idle": "2023-10-31T13:08:13.461863Z",
     "shell.execute_reply": "2023-10-31T13:08:13.460927Z",
     "shell.execute_reply.started": "2023-10-31T13:08:13.115099Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import gc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:13.464106Z",
     "iopub.status.busy": "2023-10-31T13:08:13.463687Z",
     "iopub.status.idle": "2023-10-31T13:08:17.041260Z",
     "shell.execute_reply": "2023-10-31T13:08:17.040306Z",
     "shell.execute_reply.started": "2023-10-31T13:08:13.464080Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "\n",
    "from torch.optim import AdamW\n",
    "from torch.optim.lr_scheduler import StepLR\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "from torch.nn.utils import clip_grad_norm_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:17.042988Z",
     "iopub.status.busy": "2023-10-31T13:08:17.042514Z",
     "iopub.status.idle": "2023-10-31T13:08:27.157324Z",
     "shell.execute_reply": "2023-10-31T13:08:27.156297Z",
     "shell.execute_reply.started": "2023-10-31T13:08:17.042956Z"
    }
   },
   "outputs": [],
   "source": [
    "import transformers\n",
    "from transformers import GPT2LMHeadModel, GPT2Tokenizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:27.160137Z",
     "iopub.status.busy": "2023-10-31T13:08:27.159831Z",
     "iopub.status.idle": "2023-10-31T13:08:27.528183Z",
     "shell.execute_reply": "2023-10-31T13:08:27.527159Z",
     "shell.execute_reply.started": "2023-10-31T13:08:27.160110Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.metrics import f1_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:27.530064Z",
     "iopub.status.busy": "2023-10-31T13:08:27.529662Z",
     "iopub.status.idle": "2023-10-31T13:08:27.536125Z",
     "shell.execute_reply": "2023-10-31T13:08:27.534881Z",
     "shell.execute_reply.started": "2023-10-31T13:08:27.530022Z"
    }
   },
   "outputs": [],
   "source": [
    "def free_memory():\n",
    "    gc.collect()\n",
    "    torch.cuda.empty_cache()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:27.540694Z",
     "iopub.status.busy": "2023-10-31T13:08:27.539993Z",
     "iopub.status.idle": "2023-10-31T13:08:29.232859Z",
     "shell.execute_reply": "2023-10-31T13:08:29.231959Z",
     "shell.execute_reply.started": "2023-10-31T13:08:27.540654Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>sentiment</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1945</th>\n",
       "      <td>Досудебное расследование по факту покупки ЕНПФ...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1957</th>\n",
       "      <td>Медики рассказали о состоянии пострадавшего му...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1969</th>\n",
       "      <td>Прошел почти год, как железнодорожным оператор...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1973</th>\n",
       "      <td>По итогам 12 месяцев 2016 года на территории р...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1975</th>\n",
       "      <td>Астана. 21 ноября. Kazakhstan Today - Агентств...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1980</th>\n",
       "      <td>Об аресте бывшего министра национальной эконом...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1982</th>\n",
       "      <td>Двое налетчиков совершили нападение на охранни...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1983</th>\n",
       "      <td>\"Самрук-Энерго\" в I квартале почти вдвое снизи...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1985</th>\n",
       "      <td>В 2016 году почти половина коррупционных прест...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1988</th>\n",
       "      <td>Google+\\nЧт 19 янв 2017 12:35:02\\nОдин из фигу...</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                   text sentiment\n",
       "id                                                               \n",
       "1945  Досудебное расследование по факту покупки ЕНПФ...  negative\n",
       "1957  Медики рассказали о состоянии пострадавшего му...  negative\n",
       "1969  Прошел почти год, как железнодорожным оператор...  negative\n",
       "1973  По итогам 12 месяцев 2016 года на территории р...  negative\n",
       "1975  Астана. 21 ноября. Kazakhstan Today - Агентств...  negative\n",
       "1980  Об аресте бывшего министра национальной эконом...  negative\n",
       "1982  Двое налетчиков совершили нападение на охранни...  negative\n",
       "1983  \"Самрук-Энерго\" в I квартале почти вдвое снизи...  negative\n",
       "1985  В 2016 году почти половина коррупционных прест...  negative\n",
       "1988  Google+\\nЧт 19 янв 2017 12:35:02\\nОдин из фигу...  negative"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "articles = pd.read_json('data/articles/train.json')\n",
    "articles.drop_duplicates(subset=['text'], inplace=True)\n",
    "articles.set_index('id', inplace=True)\n",
    "articles.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:29.234844Z",
     "iopub.status.busy": "2023-10-31T13:08:29.234535Z",
     "iopub.status.idle": "2023-10-31T13:08:29.498506Z",
     "shell.execute_reply": "2023-10-31T13:08:29.497408Z",
     "shell.execute_reply.started": "2023-10-31T13:08:29.234818Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAGdCAYAAADnrPLBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA3PElEQVR4nO3de3RU5b3/8U8SkiEBJsglGSgh5oBCotwRGC8YgWSAlIOV9qggoHI5sIISUi7Nr4ABtLFpEakitJUSrNCCrdoKaDKEBkTCLRJBsBQ50NgFkxxBCCEwDMn8/nBlH8YAMmHSsOP7tVbWYj/72c/+7lnzzHzYe89MkNfr9QoAAMCkghu6AAAAgJtBmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKbWpKELqC/V1dU6ceKEWrRooaCgoIYuBwAA3ACv16tz586pffv2Cg6+sXMujTbMnDhxQjExMQ1dBgAAqIMvvvhCHTp0uKG+jTbMtGjRQtLXD4bVag3YuB6PR3l5eUpOTlZoaGjAxgVw45iHQMOqzzlYXl6umJgY4338RjTaMFNzaclqtQY8zERERMhqtfIiCjQQ5iHQsP4dc9CfW0Ru6gbgF198UUFBQUpLSzPaLl68qNTUVLVu3VrNmzfXqFGjVFpa6rNdSUmJUlJSFBERoaioKM2aNUuXL1/26VNQUKDevXvLYrGoc+fOysnJuZlSAQBAI1XnMLNnzx79+te/Vvfu3X3aZ8yYoffee09vvfWWtm7dqhMnTuiRRx4x1ldVVSklJUWXLl3Sjh07tHr1auXk5Gj+/PlGn2PHjiklJUUPPfSQiouLlZaWpokTJyo3N7eu5QIAgEaqTmGmoqJCY8aM0W9/+1vddtttRvvZs2e1cuVKvfTSSxo0aJD69OmjVatWaceOHdq5c6ckKS8vT4cOHdKbb76pnj17atiwYVq0aJGWLVumS5cuSZJWrFihuLg4LV68WPHx8Zo2bZp++MMfasmSJQE4ZAAA0JjUKcykpqYqJSVFQ4YM8WkvKiqSx+Pxae/atas6duyowsJCSVJhYaG6deum6Ohoo4/D4VB5ebkOHjxo9Pnm2A6HwxgDAACght83AP/xj3/Uxx9/rD179tRa53K5FBYWppYtW/q0R0dHy+VyGX2uDDI162vWXa9PeXm5Lly4oPDw8Fr7drvdcrvdxnJ5ebmkr29S8ng8fh7ltdWMFcgxAfiHeQg0rPqcg3UZ068w88UXX2j69OlyOp1q2rSp3zurT1lZWVqwYEGt9ry8PEVERAR8f06nM+BjAvAP8xBoWPUxBysrK/3exq8wU1RUpLKyMvXu3dtoq6qq0rZt2/Tqq68qNzdXly5d0pkzZ3zOzpSWlspms0mSbDabdu/e7TNuzaedruzzzU9AlZaWymq1XvWsjCRlZGQoPT3dWK75nHpycnLAP5rtdDqVlJTER0KBBsI8BBpWfc7Bmisr/vArzAwePFgHDhzwaXvqqafUtWtXzZkzRzExMQoNDVV+fr5GjRolSTp8+LBKSkpkt9slSXa7XS+88ILKysoUFRUl6etkZ7ValZCQYPTZtGmTz36cTqcxxtVYLBZZLJZa7aGhofXyYldf4wK4ccxDoGHVxxysy3h+hZkWLVro7rvv9mlr1qyZWrdubbRPmDBB6enpatWqlaxWq5555hnZ7XYNGDBAkpScnKyEhASNHTtW2dnZcrlcmjt3rlJTU40wMmXKFL366quaPXu2nn76aW3ZskXr16/Xxo0b/T5AAADQuAX8G4CXLFmi4OBgjRo1Sm63Ww6HQ6+99pqxPiQkRBs2bNDUqVNlt9vVrFkzjR8/XgsXLjT6xMXFaePGjZoxY4aWLl2qDh066PXXX5fD4Qh0uQAAwORuOswUFBT4LDdt2lTLli3TsmXLrrlNbGxsrctI35SYmKh9+/bdbHkAAKCRu6mfMwAAAGhohBkAAGBqhBkAAGBqAb8BGAAA+Of2n5jr07qWEK+y+zV0Ff+HMzMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDU/Aozy5cvV/fu3WW1WmW1WmW32/X+++8b6xMTExUUFOTzN2XKFJ8xSkpKlJKSooiICEVFRWnWrFm6fPmyT5+CggL17t1bFotFnTt3Vk5OTt2PEAAANGpN/OncoUMHvfjii7rjjjvk9Xq1evVqjRw5Uvv27dNdd90lSZo0aZIWLlxobBMREWH8u6qqSikpKbLZbNqxY4dOnjypcePGKTQ0VD/72c8kSceOHVNKSoqmTJmiNWvWKD8/XxMnTlS7du3kcDgCccwAAKAR8SvMjBgxwmf5hRde0PLly7Vz504jzERERMhms111+7y8PB06dEibN29WdHS0evbsqUWLFmnOnDnKzMxUWFiYVqxYobi4OC1evFiSFB8fr+3bt2vJkiWEGQAAUItfYeZKVVVVeuutt3T+/HnZ7Xajfc2aNXrzzTdls9k0YsQIzZs3zzg7U1hYqG7duik6Otro73A4NHXqVB08eFC9evVSYWGhhgwZ4rMvh8OhtLS069bjdrvldruN5fLyckmSx+ORx+Op62HWUjNWIMcE4B/mIRobS4i3oUvwiyX463rrYw7WZUy/w8yBAwdkt9t18eJFNW/eXO+8844SEhIkSaNHj1ZsbKzat2+v/fv3a86cOTp8+LDefvttSZLL5fIJMpKMZZfLdd0+5eXlunDhgsLDw69aV1ZWlhYsWFCrPS8vz+dSV6A4nc6AjwnAP8xDNBbZ/Rq6grqpjzlYWVnp9zZ+h5kuXbqouLhYZ8+e1Z/+9CeNHz9eW7duVUJCgiZPnmz069atm9q1a6fBgwfr6NGj6tSpk9/F+SMjI0Pp6enGcnl5uWJiYpScnCyr1Rqw/Xg8HjmdTiUlJSk0NDRg4wK4ccxDNDZ3Z+Y2dAl+sQR7tahvdb3MwZorK/7wO8yEhYWpc+fOkqQ+ffpoz549Wrp0qX7961/X6tu/f39J0ueff65OnTrJZrNp9+7dPn1KS0slybjPxmazGW1X9rFardc8KyNJFotFFoulVntoaGi9vNjV17gAbhzzEI2FuyqooUuok/qYg3UZ76a/Z6a6utrnXpUrFRcXS5LatWsnSbLb7Tpw4IDKysqMPk6nU1ar1bhUZbfblZ+f7zOO0+n0uS8HAACghl9nZjIyMjRs2DB17NhR586d09q1a1VQUKDc3FwdPXpUa9eu1fDhw9W6dWvt379fM2bM0MCBA9W9e3dJUnJyshISEjR27FhlZ2fL5XJp7ty5Sk1NNc6qTJkyRa+++qpmz56tp59+Wlu2bNH69eu1cePGwB89AAAwPb/CTFlZmcaNG6eTJ08qMjJS3bt3V25urpKSkvTFF19o8+bNevnll3X+/HnFxMRo1KhRmjt3rrF9SEiINmzYoKlTp8put6tZs2YaP368z/fSxMXFaePGjZoxY4aWLl2qDh066PXXX+dj2QAA4Kr8CjMrV6685rqYmBht3br1W8eIjY3Vpk2brtsnMTFR+/bt86c0AADwHcVvMwEAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFMjzAAAAFPzK8wsX75c3bt3l9VqldVqld1u1/vvv2+sv3jxolJTU9W6dWs1b95co0aNUmlpqc8YJSUlSklJUUREhKKiojRr1ixdvnzZp09BQYF69+4ti8Wizp07Kycnp+5HCAAAGjW/wkyHDh304osvqqioSHv37tWgQYM0cuRIHTx4UJI0Y8YMvffee3rrrbe0detWnThxQo888oixfVVVlVJSUnTp0iXt2LFDq1evVk5OjubPn2/0OXbsmFJSUvTQQw+puLhYaWlpmjhxonJzcwN0yAAAoDFp4k/nESNG+Cy/8MILWr58uXbu3KkOHTpo5cqVWrt2rQYNGiRJWrVqleLj47Vz504NGDBAeXl5OnTokDZv3qzo6Gj17NlTixYt0pw5c5SZmamwsDCtWLFCcXFxWrx4sSQpPj5e27dv15IlS+RwOAJ02AAAoLHwK8xcqaqqSm+99ZbOnz8vu92uoqIieTweDRkyxOjTtWtXdezYUYWFhRowYIAKCwvVrVs3RUdHG30cDoemTp2qgwcPqlevXiosLPQZo6ZPWlradetxu91yu93Gcnl5uSTJ4/HI4/HU9TBrqRkrkGMC8A/zEI2NJcTb0CX4xRL8db31MQfrMqbfYebAgQOy2+26ePGimjdvrnfeeUcJCQkqLi5WWFiYWrZs6dM/OjpaLpdLkuRyuXyCTM36mnXX61NeXq4LFy4oPDz8qnVlZWVpwYIFtdrz8vIUERHh72F+K6fTGfAxAfiHeYjGIrtfQ1dQN/UxBysrK/3exu8w06VLFxUXF+vs2bP605/+pPHjx2vr1q1+7zjQMjIylJ6ebiyXl5crJiZGycnJslqtAduPx+OR0+lUUlKSQkNDAzYugBvHPERjc3emue4LtQR7tahvdb3MwZorK/7wO8yEhYWpc+fOkqQ+ffpoz549Wrp0qR599FFdunRJZ86c8Tk7U1paKpvNJkmy2WzavXu3z3g1n3a6ss83PwFVWloqq9V6zbMykmSxWGSxWGq1h4aG1suLXX2NC+DGMQ/RWLirghq6hDqpjzlYl/Fu+ntmqqur5Xa71adPH4WGhio/P99Yd/jwYZWUlMhut0uS7Ha7Dhw4oLKyMqOP0+mU1WpVQkKC0efKMWr61IwBAABwJb/OzGRkZGjYsGHq2LGjzp07p7Vr16qgoEC5ubmKjIzUhAkTlJ6erlatWslqteqZZ56R3W7XgAEDJEnJyclKSEjQ2LFjlZ2dLZfLpblz5yo1NdU4qzJlyhS9+uqrmj17tp5++mlt2bJF69ev18aNGwN/9AAAwPT8CjNlZWUaN26cTp48qcjISHXv3l25ublKSkqSJC1ZskTBwcEaNWqU3G63HA6HXnvtNWP7kJAQbdiwQVOnTpXdblezZs00fvx4LVy40OgTFxenjRs3asaMGVq6dKk6dOig119/nY9lAwCAq/IrzKxcufK665s2baply5Zp2bJl1+wTGxurTZs2XXecxMRE7du3z5/SAADAdxS/zQQAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEytSUMXAAB1dXdmrtxVQQ1dxg07/mJKQ5cANEqcmQEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKbmV5jJysrSPffcoxYtWigqKkoPP/ywDh8+7NMnMTFRQUFBPn9Tpkzx6VNSUqKUlBRFREQoKipKs2bN0uXLl336FBQUqHfv3rJYLOrcubNycnLqdoQAAKBR8yvMbN26Vampqdq5c6ecTqc8Ho+Sk5N1/vx5n36TJk3SyZMnjb/s7GxjXVVVlVJSUnTp0iXt2LFDq1evVk5OjubPn2/0OXbsmFJSUvTQQw+puLhYaWlpmjhxonJzc2/ycAEAQGPj169mf/DBBz7LOTk5ioqKUlFRkQYOHGi0R0REyGazXXWMvLw8HTp0SJs3b1Z0dLR69uypRYsWac6cOcrMzFRYWJhWrFihuLg4LV68WJIUHx+v7du3a8mSJXI4HP4eIwAAaMT8CjPfdPbsWUlSq1atfNrXrFmjN998UzabTSNGjNC8efMUEREhSSosLFS3bt0UHR1t9Hc4HJo6daoOHjyoXr16qbCwUEOGDPEZ0+FwKC0t7Zq1uN1uud1uY7m8vFyS5PF45PF4buYwfdSMFcgxAfinZv5Zgr0NXIl/eN3AtVhCzPVcrpl79fGcrsuYdQ4z1dXVSktL03333ae7777baB89erRiY2PVvn177d+/X3PmzNHhw4f19ttvS5JcLpdPkJFkLLtcruv2KS8v14ULFxQeHl6rnqysLC1YsKBWe15enhGkAsnpdAZ8TAD+WdS3uqFL8MumTZsaugTcorL7NXQFdVMf74WVlZV+b1PnMJOamqpPP/1U27dv92mfPHmy8e9u3bqpXbt2Gjx4sI4ePapOnTrVdXffKiMjQ+np6cZyeXm5YmJilJycLKvVGrD9eDweOZ1OJSUlKTQ0NGDjArhxNfNw3t5guauDGrqcG/ZpJpfJcXV3Z5rrnlBLsFeL+lbXy3thzZUVf9QpzEybNk0bNmzQtm3b1KFDh+v27d+/vyTp888/V6dOnWSz2bR7926fPqWlpZJk3Gdjs9mMtiv7WK3Wq56VkSSLxSKLxVKrPTQ0tF5CR32NC+DGuauD5K4yT5jhNQPXYqbn8ZXq472wLuP59Wkmr9eradOm6Z133tGWLVsUFxf3rdsUFxdLktq1aydJstvtOnDggMrKyow+TqdTVqtVCQkJRp/8/HyfcZxOp+x2uz/lAgCA7wC/wkxqaqrefPNNrV27Vi1atJDL5ZLL5dKFCxckSUePHtWiRYtUVFSk48eP669//avGjRungQMHqnv37pKk5ORkJSQkaOzYsfrkk0+Um5uruXPnKjU11TizMmXKFP3P//yPZs+erb///e967bXXtH79es2YMSPAhw8AAMzOrzCzfPlynT17VomJiWrXrp3xt27dOklSWFiYNm/erOTkZHXt2lU//vGPNWrUKL333nvGGCEhIdqwYYNCQkJkt9v1xBNPaNy4cVq4cKHRJy4uThs3bpTT6VSPHj20ePFivf7663wsGwAA1OLXPTNe7/U/OhYTE6OtW7d+6zixsbHfeld/YmKi9u3b5095AADgO4jfZgIAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKZGmAEAAKbmV5jJysrSPffcoxYtWigqKkoPP/ywDh8+7NPn4sWLSk1NVevWrdW8eXONGjVKpaWlPn1KSkqUkpKiiIgIRUVFadasWbp8+bJPn4KCAvXu3VsWi0WdO3dWTk5O3Y4QAAA0an6Fma1btyo1NVU7d+6U0+mUx+NRcnKyzp8/b/SZMWOG3nvvPb311lvaunWrTpw4oUceecRYX1VVpZSUFF26dEk7duzQ6tWrlZOTo/nz5xt9jh07ppSUFD300EMqLi5WWlqaJk6cqNzc3AAcMgAAaEya+NP5gw8+8FnOyclRVFSUioqKNHDgQJ09e1YrV67U2rVrNWjQIEnSqlWrFB8fr507d2rAgAHKy8vToUOHtHnzZkVHR6tnz55atGiR5syZo8zMTIWFhWnFihWKi4vT4sWLJUnx8fHavn27lixZIofDEaBDBwAAjYFfYeabzp49K0lq1aqVJKmoqEgej0dDhgwx+nTt2lUdO3ZUYWGhBgwYoMLCQnXr1k3R0dFGH4fDoalTp+rgwYPq1auXCgsLfcao6ZOWlnbNWtxut9xut7FcXl4uSfJ4PPJ4PDdzmD5qxgrkmAD8UzP/LMHeBq7EP7xu4FosIeZ6LtfMvfp4TtdlzDqHmerqaqWlpem+++7T3XffLUlyuVwKCwtTy5YtffpGR0fL5XIZfa4MMjXra9Zdr095ebkuXLig8PDwWvVkZWVpwYIFtdrz8vIUERFRt4O8DqfTGfAxAfhnUd/qhi7BL5s2bWroEnCLyu7X0BXUTX28F1ZWVvq9TZ3DTGpqqj799FNt3769rkMEVEZGhtLT043l8vJyxcTEKDk5WVarNWD78Xg8cjqdSkpKUmhoaMDGBXDjaubhvL3BclcHNXQ5N+zTTC6T4+ruzjTXPaGWYK8W9a2ul/fCmisr/qhTmJk2bZo2bNigbdu2qUOHDka7zWbTpUuXdObMGZ+zM6WlpbLZbEaf3bt3+4xX82mnK/t88xNQpaWlslqtVz0rI0kWi0UWi6VWe2hoaL2EjvoaF8CNc1cHyV1lnjDDawauxUzP4yvVx3thXcbz69NMXq9X06ZN0zvvvKMtW7YoLi7OZ32fPn0UGhqq/Px8o+3w4cMqKSmR3W6XJNntdh04cEBlZWVGH6fTKavVqoSEBKPPlWPU9KkZAwAAoIZfZ2ZSU1O1du1a/eUvf1GLFi2Me1wiIyMVHh6uyMhITZgwQenp6WrVqpWsVqueeeYZ2e12DRgwQJKUnJyshIQEjR07VtnZ2XK5XJo7d65SU1ONMytTpkzRq6++qtmzZ+vpp5/Wli1btH79em3cuDHAhw8AAMzOrzMzy5cv19mzZ5WYmKh27doZf+vWrTP6LFmyRN///vc1atQoDRw4UDabTW+//baxPiQkRBs2bFBISIjsdrueeOIJjRs3TgsXLjT6xMXFaePGjXI6nerRo4cWL16s119/nY9lAwCAWvw6M+P1fvtHx5o2baply5Zp2bJl1+wTGxv7rXf1JyYmat++ff6UBwAAvoP4bSYAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqhBkAAGBqfoeZbdu2acSIEWrfvr2CgoL07rvv+qx/8sknFRQU5PM3dOhQnz6nT5/WmDFjZLVa1bJlS02YMEEVFRU+ffbv368HHnhATZs2VUxMjLKzs/0/OgAA0Oj5HWbOnz+vHj16aNmyZdfsM3ToUJ08edL4+8Mf/uCzfsyYMTp48KCcTqc2bNigbdu2afLkycb68vJyJScnKzY2VkVFRfrFL36hzMxM/eY3v/G3XAAA0Mg18XeDYcOGadiwYdftY7FYZLPZrrrus88+0wcffKA9e/aob9++kqRXXnlFw4cP1y9/+Uu1b99ea9as0aVLl/S73/1OYWFhuuuuu1RcXKyXXnrJJ/QAAADUyz0zBQUFioqKUpcuXTR16lSdOnXKWFdYWKiWLVsaQUaShgwZouDgYO3atcvoM3DgQIWFhRl9HA6HDh8+rK+++qo+SgYAACbl95mZbzN06FA98sgjiouL09GjR/X//t//07Bhw1RYWKiQkBC5XC5FRUX5FtGkiVq1aiWXyyVJcrlciouL8+kTHR1trLvttttq7dftdsvtdhvL5eXlkiSPxyOPxxOw46sZK5BjAvBPzfyzBHsbuBL/8LqBa7GEmOu5XDP36uM5XZcxAx5mHnvsMePf3bp1U/fu3dWpUycVFBRo8ODBgd6dISsrSwsWLKjVnpeXp4iIiIDvz+l0BnxMAP5Z1Le6oUvwy6ZNmxq6BNyisvs1dAV1Ux/vhZWVlX5vE/Aw803/8R//oTZt2ujzzz/X4MGDZbPZVFZW5tPn8uXLOn36tHGfjc1mU2lpqU+fmuVr3YuTkZGh9PR0Y7m8vFwxMTFKTk6W1WoN2PF4PB45nU4lJSUpNDQ0YOMCuHE183De3mC5q4Maupwb9mmmo6FLwC3q7szchi7BL5Zgrxb1ra6X98KaKyv+qPcw869//UunTp1Su3btJEl2u11nzpxRUVGR+vTpI0nasmWLqqur1b9/f6PPT3/6U3k8HuNBcjqd6tKly1UvMUlf33RssVhqtYeGhtZL6KivcQHcOHd1kNxV5gkzvGbgWsz0PL5SfbwX1mU8v28ArqioUHFxsYqLiyVJx44dU3FxsUpKSlRRUaFZs2Zp586dOn78uPLz8zVy5Eh17txZDsfX/yOJj4/X0KFDNWnSJO3evVsfffSRpk2bpscee0zt27eXJI0ePVphYWGaMGGCDh48qHXr1mnp0qU+Z14AAACkOoSZvXv3qlevXurVq5ckKT09Xb169dL8+fMVEhKi/fv36z//8z915513asKECerTp48+/PBDn7Mma9asUdeuXTV48GANHz5c999/v893yERGRiovL0/Hjh1Tnz599OMf/1jz58/nY9kAAKAWvy8zJSYmyuu99l3Xubnfft2vVatWWrt27XX7dO/eXR9++KG/5QEAgO8YfpsJAACYGmEGAACYGmEGAACYGmEGAACYWr1/z0xjdXdmrqm+F+D4iykNXQIAAPWCMzMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDUCDMAAMDU/A4z27Zt04gRI9S+fXsFBQXp3Xff9Vnv9Xo1f/58tWvXTuHh4RoyZIiOHDni0+f06dMaM2aMrFarWrZsqQkTJqiiosKnz/79+/XAAw+oadOmiomJUXZ2tv9HBwAAGj2/w8z58+fVo0cPLVu27Krrs7Oz9atf/UorVqzQrl271KxZMzkcDl28eNHoM2bMGB08eFBOp1MbNmzQtm3bNHnyZGN9eXm5kpOTFRsbq6KiIv3iF79QZmamfvOb39ThEAEAQGPWxN8Nhg0bpmHDhl11ndfr1csvv6y5c+dq5MiRkqQ33nhD0dHRevfdd/XYY4/ps88+0wcffKA9e/aob9++kqRXXnlFw4cP1y9/+Uu1b99ea9as0aVLl/S73/1OYWFhuuuuu1RcXKyXXnrJJ/QAAAD4HWau59ixY3K5XBoyZIjRFhkZqf79+6uwsFCPPfaYCgsL1bJlSyPISNKQIUMUHBysXbt26Qc/+IEKCws1cOBAhYWFGX0cDod+/vOf66uvvtJtt91Wa99ut1tut9tYLi8vlyR5PB55PJ6AHWPNWJZgb8DG/HcI5GMANDTmIRobS4i5nss1c68+ntN1GTOgYcblckmSoqOjfdqjo6ONdS6XS1FRUb5FNGmiVq1a+fSJi4urNUbNuquFmaysLC1YsKBWe15eniIiIup4RNe2qG91wMesT5s2bWroEoCAYx6iscju19AV1I3T6Qz4mJWVlX5vE9Aw05AyMjKUnp5uLJeXlysmJkbJycmyWq0B24/H45HT6dS8vcFyVwcFbNz69mmmo6FLAAKGeYjG5u7M3IYuwS+WYK8W9a1WUlKSQkNDAzp2zZUVfwQ0zNhsNklSaWmp2rVrZ7SXlpaqZ8+eRp+ysjKf7S5fvqzTp08b29tsNpWWlvr0qVmu6fNNFotFFoulVntoaGjAH2hJclcHyV1lnhfR+ngMgIbGPERjYabn8ZXq4z22LuMF9Htm4uLiZLPZlJ+fb7SVl5dr165dstvtkiS73a4zZ86oqKjI6LNlyxZVV1erf//+Rp9t27b5XDdzOp3q0qXLVS8xAQCA7y6/w0xFRYWKi4tVXFws6eubfouLi1VSUqKgoCClpaXp+eef11//+lcdOHBA48aNU/v27fXwww9LkuLj4zV06FBNmjRJu3fv1kcffaRp06bpscceU/v27SVJo0ePVlhYmCZMmKCDBw9q3bp1Wrp0qc9lJAAAAKkOl5n27t2rhx56yFiuCRjjx49XTk6OZs+erfPnz2vy5Mk6c+aM7r//fn3wwQdq2rSpsc2aNWs0bdo0DR48WMHBwRo1apR+9atfGesjIyOVl5en1NRU9enTR23atNH8+fP5WDYAAKjF7zCTmJgor/faHyELCgrSwoULtXDhwmv2adWqldauXXvd/XTv3l0ffvihv+UBAIDvGH6bCQAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmBphBgAAmFrAw0xmZqaCgoJ8/rp27Wqsv3jxolJTU9W6dWs1b95co0aNUmlpqc8YJSUlSklJUUREhKKiojRr1ixdvnw50KUCAIBGoEl9DHrXXXdp8+bN/7eTJv+3mxkzZmjjxo166623FBkZqWnTpumRRx7RRx99JEmqqqpSSkqKbDabduzYoZMnT2rcuHEKDQ3Vz372s/ooFwAAmFi9hJkmTZrIZrPVaj979qxWrlyptWvXatCgQZKkVatWKT4+Xjt37tSAAQOUl5enQ4cOafPmzYqOjlbPnj21aNEizZkzR5mZmQoLC6uPkgEAgEnVS5g5cuSI2rdvr6ZNm8putysrK0sdO3ZUUVGRPB6PhgwZYvTt2rWrOnbsqMLCQg0YMECFhYXq1q2boqOjjT4Oh0NTp07VwYMH1atXr6vu0+12y+12G8vl5eWSJI/HI4/HE7BjqxnLEuwN2Jj/DoF8DICGxjxEY2MJMddzuWbu1cdzui5jBjzM9O/fXzk5OerSpYtOnjypBQsW6IEHHtCnn34ql8ulsLAwtWzZ0meb6OhouVwuSZLL5fIJMjXra9ZdS1ZWlhYsWFCrPS8vTxERETd5VLUt6lsd8DHr06ZNmxq6BCDgmIdoLLL7NXQFdeN0OgM+ZmVlpd/bBDzMDBs2zPh39+7d1b9/f8XGxmr9+vUKDw8P9O4MGRkZSk9PN5bLy8sVExOj5ORkWa3WgO3H4/HI6XRq3t5guauDAjZuffs009HQJQABwzxEY3N3Zm5Dl+AXS7BXi/pWKykpSaGhoQEdu+bKij/q5TLTlVq2bKk777xTn3/+uZKSknTp0iWdOXPG5+xMaWmpcY+NzWbT7t27fcao+bTT1e7DqWGxWGSxWGq1h4aGBvyBliR3dZDcVeZ5Ea2PxwBoaMxDNBZmeh5fqT7eY+syXr1/z0xFRYWOHj2qdu3aqU+fPgoNDVV+fr6x/vDhwyopKZHdbpck2e12HThwQGVlZUYfp9Mpq9WqhISE+i4XAACYTMDPzMycOVMjRoxQbGysTpw4oeeee04hISF6/PHHFRkZqQkTJig9PV2tWrWS1WrVM888I7vdrgEDBkiSkpOTlZCQoLFjxyo7O1sul0tz585VamrqVc+8AACA77aAh5l//etfevzxx3Xq1Cm1bdtW999/v3bu3Km2bdtKkpYsWaLg4GCNGjVKbrdbDodDr732mrF9SEiINmzYoKlTp8put6tZs2YaP368Fi5cGOhSAQBAIxDwMPPHP/7xuuubNm2qZcuWadmyZdfsExsby13/AADghvDbTAAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNRu6TCzbNky3X777WratKn69++v3bt3N3RJAADgFnPLhpl169YpPT1dzz33nD7++GP16NFDDodDZWVlDV0aAAC4hdyyYeall17SpEmT9NRTTykhIUErVqxQRESEfve73zV0aQAA4BbSpKELuJpLly6pqKhIGRkZRltwcLCGDBmiwsLCq27jdrvldruN5bNnz0qSTp8+LY/HE7DaPB6PKisr1cQTrKrqoICNW99OnTrV0CUAAcM8RGPT5PL5hi7BL02qvaqsrNapU6cUGhoa0LHPnTsnSfJ6vTdeT0ArCJAvv/xSVVVVio6O9mmPjo7W3//+96tuk5WVpQULFtRqj4uLq5cazabN4oauAADzEI3J6Hoe/9y5c4qMjLyhvrdkmKmLjIwMpaenG8vV1dU6ffq0WrduraCgwP3Prby8XDExMfriiy9ktVoDNi6AG8c8BBpWfc5Br9erc+fOqX379je8zS0ZZtq0aaOQkBCVlpb6tJeWlspms111G4vFIovF4tPWsmXL+ipRVquVF1GggTEPgYZVX3PwRs/I1LglbwAOCwtTnz59lJ+fb7RVV1crPz9fdru9ASsDAAC3mlvyzIwkpaena/z48erbt6/69eunl19+WefPn9dTTz3V0KUBAIBbyC0bZh599FH97//+r+bPny+Xy6WePXvqgw8+qHVT8L+bxWLRc889V+uSFoB/H+Yh0LButTkY5PXns08AAAC3mFvynhkAAIAbRZgBAACmRpgBAACmRpipR5mZmerZs2dDlwE0GgUFBQoKCtKZM2eu2+/222/Xyy+//G+pCUBg1WX+EmYCJCgoSO+++65P28yZM32+KwfAzbn33nt18uRJ4wu1cnJyrvrlmHv27NHkyZP/zdUB302JiYlKS0tr0Bpu2Y9mNwbNmzdX8+bNG7oMoNEICwu75reAX6lt27b/hmoA3Civ16uqqio1aVI/scP0Z2YSExP17LPPavbs2WrVqpVsNpsyMzON9WfOnNHEiRPVtm1bWa1WDRo0SJ988onPGM8//7yioqLUokULTZw4UT/5yU98Lg/t2bNHSUlJatOmjSIjI/Xggw/q448/NtbffvvtkqQf/OAHCgoKMpavvMyUl5enpk2b1jo9Pn36dA0aNMhY3r59ux544AGFh4crJiZGzz77rM6fN9evqeK7LTExUdOmTdO0adMUGRmpNm3aaN68ecYv4H711VcaN26cbrvtNkVERGjYsGE6cuSIsf0///lPjRgxQrfddpuaNWumu+66S5s2bZLke5mpoKBATz31lM6ePaugoCAFBQUZc//K09SjR4/Wo48+6lOjx+NRmzZt9MYbb0j6+hvGs7KyFBcXp/DwcPXo0UN/+tOf6vmRAurfzb5HPvnkk3r44Yd9xkxLS1NiYqKxfuvWrVq6dKkxD48fP27M1ffff199+vSRxWLR9u3bdfToUY0cOVLR0dFq3ry57rnnHm3evPmmj9P0YUaSVq9erWbNmmnXrl3Kzs7WwoUL5XQ6JUk/+tGPVFZWpvfff19FRUXq3bu3Bg8erNOnT0uS1qxZoxdeeEE///nPVVRUpI4dO2r58uU+4587d07jx4/X9u3btXPnTt1xxx0aPny48TPle/bskSStWrVKJ0+eNJavNHjwYLVs2VJ//vOfjbaqqiqtW7dOY8aMkSQdPXpUQ4cO1ahRo7R//36tW7dO27dv17Rp0wL/oAH1aPXq1WrSpIl2796tpUuX6qWXXtLrr78u6esXv7179+qvf/2rCgsL5fV6NXz4cHk8HklSamqq3G63tm3bpgMHDujnP//5Vc9w3nvvvXr55ZdltVp18uRJnTx5UjNnzqzVb8yYMXrvvfdUUVFhtOXm5qqyslI/+MEPJElZWVl64403tGLFCh08eFAzZszQE088oa1bt9bHwwP8W93Me+S3Wbp0qex2uyZNmmTMw5iYGGP9T37yE7344ov67LPP1L17d1VUVGj48OHKz8/Xvn37NHToUI0YMUIlJSU3d5Bek3vwwQe9999/v0/bPffc450zZ473ww8/9FqtVu/Fixd91nfq1Mn761//2uv1er39+/f3pqam+qy/7777vD169LjmPquqqrwtWrTwvvfee0abJO8777zj0++5557zGWf69OneQYMGGcu5ublei8Xi/eqrr7xer9c7YcIE7+TJk33G+PDDD73BwcHeCxcuXLMe4Fby4IMPeuPj473V1dVG25w5c7zx8fHef/zjH15J3o8++shY9+WXX3rDw8O969ev93q9Xm+3bt28mZmZVx37b3/7m1eSMWdWrVrljYyMrNUvNjbWu2TJEq/X6/V6PB5vmzZtvG+88Yax/vHHH/c++uijXq/X67148aI3IiLCu2PHDp8xJkyY4H388cf9Pn7gVnKz75Hjx4/3jhw50mf99OnTvQ8++KDP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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "articles.sentiment.hist()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:29.500283Z",
     "iopub.status.busy": "2023-10-31T13:08:29.499911Z",
     "iopub.status.idle": "2023-10-31T13:08:29.505586Z",
     "shell.execute_reply": "2023-10-31T13:08:29.504376Z",
     "shell.execute_reply.started": "2023-10-31T13:08:29.500244Z"
    }
   },
   "outputs": [],
   "source": [
    "sentiment_map = {\n",
    "    'negative': 0,\n",
    "    'neutral': 1,\n",
    "    'positive': 2\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:29.507479Z",
     "iopub.status.busy": "2023-10-31T13:08:29.507020Z",
     "iopub.status.idle": "2023-10-31T13:08:29.534182Z",
     "shell.execute_reply": "2023-10-31T13:08:29.533181Z",
     "shell.execute_reply.started": "2023-10-31T13:08:29.507447Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>sentiment</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1945</th>\n",
       "      <td>Досудебное расследование по факту покупки ЕНПФ...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1957</th>\n",
       "      <td>Медики рассказали о состоянии пострадавшего му...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1969</th>\n",
       "      <td>Прошел почти год, как железнодорожным оператор...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1973</th>\n",
       "      <td>По итогам 12 месяцев 2016 года на территории р...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1975</th>\n",
       "      <td>Астана. 21 ноября. Kazakhstan Today - Агентств...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1980</th>\n",
       "      <td>Об аресте бывшего министра национальной эконом...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1982</th>\n",
       "      <td>Двое налетчиков совершили нападение на охранни...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1983</th>\n",
       "      <td>\"Самрук-Энерго\" в I квартале почти вдвое снизи...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1985</th>\n",
       "      <td>В 2016 году почти половина коррупционных прест...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1988</th>\n",
       "      <td>Google+\\nЧт 19 янв 2017 12:35:02\\nОдин из фигу...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                   text  sentiment\n",
       "id                                                                \n",
       "1945  Досудебное расследование по факту покупки ЕНПФ...          0\n",
       "1957  Медики рассказали о состоянии пострадавшего му...          0\n",
       "1969  Прошел почти год, как железнодорожным оператор...          0\n",
       "1973  По итогам 12 месяцев 2016 года на территории р...          0\n",
       "1975  Астана. 21 ноября. Kazakhstan Today - Агентств...          0\n",
       "1980  Об аресте бывшего министра национальной эконом...          0\n",
       "1982  Двое налетчиков совершили нападение на охранни...          0\n",
       "1983  \"Самрук-Энерго\" в I квартале почти вдвое снизи...          0\n",
       "1985  В 2016 году почти половина коррупционных прест...          0\n",
       "1988  Google+\\nЧт 19 янв 2017 12:35:02\\nОдин из фигу...          0"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "articles.sentiment = articles.sentiment.apply(lambda x: sentiment_map[x])\n",
    "articles.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:29.535878Z",
     "iopub.status.busy": "2023-10-31T13:08:29.535507Z",
     "iopub.status.idle": "2023-10-31T13:08:29.574435Z",
     "shell.execute_reply": "2023-10-31T13:08:29.573268Z",
     "shell.execute_reply.started": "2023-10-31T13:08:29.535841Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'cuda'"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "device = ('cuda' if torch.cuda.is_available() else 'cpu')\n",
    "device"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:29.577612Z",
     "iopub.status.busy": "2023-10-31T13:08:29.577256Z",
     "iopub.status.idle": "2023-10-31T13:08:29.586478Z",
     "shell.execute_reply": "2023-10-31T13:08:29.585540Z",
     "shell.execute_reply.started": "2023-10-31T13:08:29.577573Z"
    }
   },
   "outputs": [],
   "source": [
    "pretrained_model_name_or_path = 'sberbank-ai/rugpt3small_based_on_gpt2'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:29.587786Z",
     "iopub.status.busy": "2023-10-31T13:08:29.587517Z",
     "iopub.status.idle": "2023-10-31T13:08:37.046309Z",
     "shell.execute_reply": "2023-10-31T13:08:37.045448Z",
     "shell.execute_reply.started": "2023-10-31T13:08:29.587761Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d81d74d15733435aad88d6004a86dcd7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading (…)lve/main/config.json:   0%|          | 0.00/608 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4b00fa4bebcd40e0b48816024e8860bf",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading pytorch_model.bin:   0%|          | 0.00/551M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c81a9ee7f0d54ade83e617dc71c5f43e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading (…)olve/main/vocab.json:   0%|          | 0.00/1.71M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6185d4af2d304af7848a9c58d20f8616",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading (…)olve/main/merges.txt:   0%|          | 0.00/1.27M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "gpt = GPT2LMHeadModel.from_pretrained(pretrained_model_name_or_path)\n",
    "tokenizer = GPT2Tokenizer.from_pretrained(pretrained_model_name_or_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:37.047896Z",
     "iopub.status.busy": "2023-10-31T13:08:37.047533Z",
     "iopub.status.idle": "2023-10-31T13:08:37.055696Z",
     "shell.execute_reply": "2023-10-31T13:08:37.054804Z",
     "shell.execute_reply.started": "2023-10-31T13:08:37.047861Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GPT2LMHeadModel(\n",
       "  (transformer): GPT2Model(\n",
       "    (wte): Embedding(50264, 768)\n",
       "    (wpe): Embedding(2048, 768)\n",
       "    (drop): Dropout(p=0.1, inplace=False)\n",
       "    (h): ModuleList(\n",
       "      (0-11): 12 x GPT2Block(\n",
       "        (ln_1): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n",
       "        (attn): GPT2Attention(\n",
       "          (c_attn): Conv1D()\n",
       "          (c_proj): Conv1D()\n",
       "          (attn_dropout): Dropout(p=0.1, inplace=False)\n",
       "          (resid_dropout): Dropout(p=0.1, inplace=False)\n",
       "        )\n",
       "        (ln_2): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n",
       "        (mlp): GPT2MLP(\n",
       "          (c_fc): Conv1D()\n",
       "          (c_proj): Conv1D()\n",
       "          (act): NewGELUActivation()\n",
       "          (dropout): Dropout(p=0.1, inplace=False)\n",
       "        )\n",
       "      )\n",
       "    )\n",
       "    (ln_f): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n",
       "  )\n",
       "  (lm_head): Linear(in_features=768, out_features=50264, bias=False)\n",
       ")"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gpt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:51.171622Z",
     "iopub.status.busy": "2023-10-31T13:08:51.170870Z",
     "iopub.status.idle": "2023-10-31T13:08:51.177025Z",
     "shell.execute_reply": "2023-10-31T13:08:51.175909Z",
     "shell.execute_reply.started": "2023-10-31T13:08:51.171589Z"
    }
   },
   "outputs": [],
   "source": [
    "for param in gpt.parameters():\n",
    "    param.requires_grad = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:53.988008Z",
     "iopub.status.busy": "2023-10-31T13:08:53.987628Z",
     "iopub.status.idle": "2023-10-31T13:08:53.996693Z",
     "shell.execute_reply": "2023-10-31T13:08:53.995579Z",
     "shell.execute_reply.started": "2023-10-31T13:08:53.987979Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_labels = articles.sentiment.nunique()\n",
    "num_labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:08:56.435265Z",
     "iopub.status.busy": "2023-10-31T13:08:56.434297Z",
     "iopub.status.idle": "2023-10-31T13:09:01.373604Z",
     "shell.execute_reply": "2023-10-31T13:09:01.372657Z",
     "shell.execute_reply.started": "2023-10-31T13:08:56.435224Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GPT2LMHeadModel(\n",
       "  (transformer): GPT2Model(\n",
       "    (wte): Embedding(50264, 768)\n",
       "    (wpe): Embedding(2048, 768)\n",
       "    (drop): Dropout(p=0.1, inplace=False)\n",
       "    (h): ModuleList(\n",
       "      (0-11): 12 x GPT2Block(\n",
       "        (ln_1): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n",
       "        (attn): GPT2Attention(\n",
       "          (c_attn): Conv1D()\n",
       "          (c_proj): Conv1D()\n",
       "          (attn_dropout): Dropout(p=0.1, inplace=False)\n",
       "          (resid_dropout): Dropout(p=0.1, inplace=False)\n",
       "        )\n",
       "        (ln_2): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n",
       "        (mlp): GPT2MLP(\n",
       "          (c_fc): Conv1D()\n",
       "          (c_proj): Conv1D()\n",
       "          (act): NewGELUActivation()\n",
       "          (dropout): Dropout(p=0.1, inplace=False)\n",
       "        )\n",
       "      )\n",
       "    )\n",
       "    (ln_f): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n",
       "  )\n",
       "  (lm_head): Linear(in_features=768, out_features=3, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gpt.lm_head = nn.Linear(gpt.config.hidden_size, num_labels)\n",
    "gpt = gpt.to(device)\n",
    "gpt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:09:01.375816Z",
     "iopub.status.busy": "2023-10-31T13:09:01.375437Z",
     "iopub.status.idle": "2023-10-31T13:09:01.382580Z",
     "shell.execute_reply": "2023-10-31T13:09:01.381624Z",
     "shell.execute_reply.started": "2023-10-31T13:09:01.375780Z"
    }
   },
   "outputs": [],
   "source": [
    "X = articles.text\n",
    "y = articles.sentiment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:09:04.105106Z",
     "iopub.status.busy": "2023-10-31T13:09:04.104211Z",
     "iopub.status.idle": "2023-10-31T13:09:04.112330Z",
     "shell.execute_reply": "2023-10-31T13:09:04.111572Z",
     "shell.execute_reply.started": "2023-10-31T13:09:04.105068Z"
    }
   },
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:09:06.420972Z",
     "iopub.status.busy": "2023-10-31T13:09:06.420599Z",
     "iopub.status.idle": "2023-10-31T13:09:06.426031Z",
     "shell.execute_reply": "2023-10-31T13:09:06.425101Z",
     "shell.execute_reply.started": "2023-10-31T13:09:06.420940Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<pad>\n"
     ]
    }
   ],
   "source": [
    "tokenizer.pad_token_id = 0\n",
    "print(tokenizer.pad_token)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:09:11.291793Z",
     "iopub.status.busy": "2023-10-31T13:09:11.291427Z",
     "iopub.status.idle": "2023-10-31T13:09:11.299182Z",
     "shell.execute_reply": "2023-10-31T13:09:11.298166Z",
     "shell.execute_reply.started": "2023-10-31T13:09:11.291765Z"
    }
   },
   "outputs": [],
   "source": [
    "class SentimentAnalysisDataset(Dataset):\n",
    "    def __init__(self, X, y, tokenizer=None, num_labels=3):\n",
    "        self.X = tokenizer(X.tolist(), \n",
    "                           truncation=True, \n",
    "                           padding=True,\n",
    "                           return_tensors=\"pt\",\n",
    "                           max_length=2048).to(device)\n",
    "        self.y = torch.tensor(y.to_numpy(), dtype=torch.int64).to(device)\n",
    "    \n",
    "    def __len__(self):\n",
    "        return len(self.y)\n",
    "    \n",
    "    def __getitem__(self, idx):\n",
    "        return self.X.input_ids[idx], self.X.attention_mask[idx], self.y[idx]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:09:13.441993Z",
     "iopub.status.busy": "2023-10-31T13:09:13.441625Z",
     "iopub.status.idle": "2023-10-31T13:10:54.836185Z",
     "shell.execute_reply": "2023-10-31T13:10:54.835292Z",
     "shell.execute_reply.started": "2023-10-31T13:09:13.441961Z"
    }
   },
   "outputs": [],
   "source": [
    "train_dataset = SentimentAnalysisDataset(X_train, y_train, tokenizer)\n",
    "test_dataset = SentimentAnalysisDataset(X_test, y_test, tokenizer)\n",
    "\n",
    "free_memory()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:10:54.838152Z",
     "iopub.status.busy": "2023-10-31T13:10:54.837861Z",
     "iopub.status.idle": "2023-10-31T13:10:54.842343Z",
     "shell.execute_reply": "2023-10-31T13:10:54.841306Z",
     "shell.execute_reply.started": "2023-10-31T13:10:54.838126Z"
    }
   },
   "outputs": [],
   "source": [
    "batch_size = 16\n",
    "num_epochs = 12"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:10:54.844076Z",
     "iopub.status.busy": "2023-10-31T13:10:54.843694Z",
     "iopub.status.idle": "2023-10-31T13:10:54.856603Z",
     "shell.execute_reply": "2023-10-31T13:10:54.855789Z",
     "shell.execute_reply.started": "2023-10-31T13:10:54.844044Z"
    }
   },
   "outputs": [],
   "source": [
    "train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:10:54.858804Z",
     "iopub.status.busy": "2023-10-31T13:10:54.858532Z",
     "iopub.status.idle": "2023-10-31T13:10:54.878199Z",
     "shell.execute_reply": "2023-10-31T13:10:54.877273Z",
     "shell.execute_reply.started": "2023-10-31T13:10:54.858780Z"
    }
   },
   "outputs": [],
   "source": [
    "optimizer = AdamW(gpt.lm_head.parameters(), lr=0.01, weight_decay=1e-4)\n",
    "criterion = nn.CrossEntropyLoss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:10:54.879822Z",
     "iopub.status.busy": "2023-10-31T13:10:54.879479Z",
     "iopub.status.idle": "2023-10-31T13:10:54.891314Z",
     "shell.execute_reply": "2023-10-31T13:10:54.890407Z",
     "shell.execute_reply.started": "2023-10-31T13:10:54.879787Z"
    }
   },
   "outputs": [],
   "source": [
    "def evaluate_model(model, data_loader):\n",
    "    ground_truth = []\n",
    "    predictions = []\n",
    "\n",
    "    model.eval()\n",
    "    for input_ids, attention_mask, labels in data_loader:\n",
    "        input_ids = input_ids.to(device)\n",
    "        attention_mask = attention_mask.to(device)\n",
    "        labels = labels.to(device)\n",
    "        outputs = model(input_ids=input_ids, attention_mask=attention_mask)\n",
    "        logits = torch.mean(outputs.logits, dim=1)\n",
    "        _, indices = torch.max(logits, 1)\n",
    "        predictions.extend(indices.tolist())\n",
    "        ground_truth.extend(labels.tolist())\n",
    "        del input_ids\n",
    "        del attention_mask\n",
    "        del labels\n",
    "        del outputs\n",
    "        del logits\n",
    "        del indices\n",
    "        free_memory()\n",
    "    accuracy = accuracy_score(ground_truth, predictions)\n",
    "    f1 = f1_score(ground_truth, predictions, average='macro')\n",
    "    del predictions\n",
    "    del ground_truth\n",
    "    free_memory()\n",
    "    return accuracy, f1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:10:54.892835Z",
     "iopub.status.busy": "2023-10-31T13:10:54.892542Z",
     "iopub.status.idle": "2023-10-31T13:10:54.904785Z",
     "shell.execute_reply": "2023-10-31T13:10:54.903930Z",
     "shell.execute_reply.started": "2023-10-31T13:10:54.892793Z"
    }
   },
   "outputs": [],
   "source": [
    "def train_model(model, train_loader, criterion, optimizer, num_epochs, \n",
    "                step_size=1, gamma=0.5):\n",
    "    scheduler = StepLR(optimizer, step_size=step_size, gamma=gamma)\n",
    "    loss_history = []\n",
    "    train_history = []\n",
    "    \n",
    "    for epoch in range(num_epochs):\n",
    "        model.train()\n",
    "        \n",
    "        loss_accum = 0\n",
    "        correct_samples = 0\n",
    "        total_samples = 0\n",
    "        \n",
    "        for i_step, (input_ids, attention_mask, y) in enumerate(train_loader):\n",
    "            input_ids = input_ids.to(device)\n",
    "            attention_mask = attention_mask.to(device)\n",
    "            y = y.to(device)\n",
    "            outputs = model(input_ids=input_ids, attention_mask=attention_mask)\n",
    "            logits = torch.mean(outputs.logits, dim=1)\n",
    "            optimizer.zero_grad()\n",
    "            loss = criterion(logits, y)\n",
    "            loss.backward()\n",
    "            clip_grad_norm_(model.lm_head.parameters(), 1.0)\n",
    "            optimizer.step()\n",
    "            \n",
    "            _, indices = torch.max(logits, 1)\n",
    "            correct_samples += torch.sum(indices == y)\n",
    "            total_samples += y.shape[0]\n",
    "            loss_accum += loss\n",
    "            \n",
    "            del outputs\n",
    "            del logits\n",
    "            del indices\n",
    "            del input_ids\n",
    "            del attention_mask\n",
    "            del y\n",
    "            free_memory()\n",
    "          \n",
    "        scheduler.step()\n",
    "        ave_loss = loss_accum / i_step\n",
    "        train_accuracy = float(correct_samples) / total_samples\n",
    "\n",
    "        loss_history.append(float(ave_loss))\n",
    "        train_history.append(train_accuracy)\n",
    "        \n",
    "        free_memory()\n",
    "\n",
    "        print(\"Average loss: %f, Train accuracy: %f\" % (ave_loss, train_accuracy))\n",
    "        \n",
    "    return loss_history, train_history"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T13:10:54.906427Z",
     "iopub.status.busy": "2023-10-31T13:10:54.906053Z",
     "iopub.status.idle": "2023-10-31T17:12:00.785304Z",
     "shell.execute_reply": "2023-10-31T17:12:00.784189Z",
     "shell.execute_reply.started": "2023-10-31T13:10:54.906371Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average loss: 1.055959, Train accuracy: 0.601038\n",
      "Average loss: 0.840529, Train accuracy: 0.654977\n",
      "Average loss: 0.707420, Train accuracy: 0.692090\n",
      "Average loss: 0.654136, Train accuracy: 0.714578\n",
      "Average loss: 0.630785, Train accuracy: 0.722755\n",
      "Average loss: 0.617199, Train accuracy: 0.732348\n",
      "Average loss: 0.604172, Train accuracy: 0.739110\n",
      "Average loss: 0.603074, Train accuracy: 0.735965\n",
      "Average loss: 0.600218, Train accuracy: 0.737852\n",
      "Average loss: 0.598015, Train accuracy: 0.739110\n",
      "Average loss: 0.597207, Train accuracy: 0.740368\n",
      "Average loss: 0.598599, Train accuracy: 0.736437\n"
     ]
    }
   ],
   "source": [
    "loss_history, train_history = train_model(gpt, \n",
    "                                          train_loader, \n",
    "                                          criterion, \n",
    "                                          optimizer, num_epochs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T17:12:00.787291Z",
     "iopub.status.busy": "2023-10-31T17:12:00.786965Z",
     "iopub.status.idle": "2023-10-31T17:12:01.017870Z",
     "shell.execute_reply": "2023-10-31T17:12:01.016723Z",
     "shell.execute_reply.started": "2023-10-31T17:12:00.787263Z"
    }
   },
   "outputs": [],
   "source": [
    "free_memory()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T17:12:01.019701Z",
     "iopub.status.busy": "2023-10-31T17:12:01.019370Z",
     "iopub.status.idle": "2023-10-31T17:12:01.295892Z",
     "shell.execute_reply": "2023-10-31T17:12:01.294903Z",
     "shell.execute_reply.started": "2023-10-31T17:12:01.019674Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGzCAYAAAD9pBdvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABTO0lEQVR4nO3dd3xUVf7/8dfMJDMppAMJJSQ06QQMRcB13Z8oCotgR+mKa2Mt7LqKBdR15auuLnasKG1FXWyroMiqKxC6sCpdIISSUALpdeb+/phkSCBAEia5M8n7+XjcR2bu3Dv3M0Pgvjn33HMshmEYiIiIiJjEanYBIiIi0rgpjIiIiIipFEZERETEVAojIiIiYiqFERERETGVwoiIiIiYSmFERERETKUwIiIiIqZSGBERERFTKYyIyDlLTExkwoQJZpchIn5KYURETvHuu+9isVhYt25dla9ffPHFdO/e/ZyO8eWXX/LYY4+d03uISMOgMCIi52zbtm28+eabNdrnyy+/5PHHH6+jikTEnyiMiMg5czgcBAYGml0GLpeLwsJCs8sQkRpSGBGRc3Zyn5GSkhIef/xxOnbsSFBQEDExMVx44YUsXboUgAkTJvDKK68AYLFYPEu5vLw8/vSnPxEfH4/D4aBTp078/e9/5+RJxi0WC5MnT2b+/Pl069YNh8PB4sWLSUxMZMSIEafUWVhYSEREBLfddlsdfAsiUlsBZhcgIr4rKyuLI0eOnLK+pKTkjPs99thjzJgxg0mTJtGvXz+ys7NZt24dGzZs4NJLL+W2227jwIEDLF26lLlz51ba1zAMrrzySr799ltuueUWevXqxVdffcX999/P/v37+cc//lFp+//85z988MEHTJ48maZNm9K2bVvGjBnDM888Q2ZmJtHR0Z5tP//8c7KzsxkzZsw5fCsi4nWGiMhJZs+ebQBnXLp16+bZPiEhwRg/frzneVJSkjFs2LAzHuOuu+4yqvon6JNPPjEA48knn6y0/tprrzUsFouxc+dOzzrAsFqtxi+//FJp223bthmA8dprr1Vaf+WVVxqJiYmGy+U663cgIvVHl2lE5LReeeUVli5desrSs2fPM+4XGRnJL7/8wo4dO2p8zC+//BKbzcbdd99daf2f/vQnDMNg8eLFldb/9re/pWvXrpXWnXfeefTv35/58+d71mVmZrJ48WJGjx5d6ZKQiJhPl2lE5LT69etHnz59TlkfFRVV5eWbck888QQjRozgvPPOo3v37lx++eWMHTv2rCEGIDU1lZYtWxIWFlZpfZcuXTyvV9S2bdsq32fcuHFMnjyZ1NRUEhIS+PDDDykpKWHs2LFnrUFE6pdaRkTE6y666CJ+/fVX3nnnHbp3785bb73F+eefz1tvveX1YwUHB1e5ftSoUQQGBnpaR+bNm0efPn3o1KmT12sQkXOjMCIidSI6OpqJEyfyz3/+k7S0NHr27FlpkLPTXSpJSEjgwIED5OTkVFq/detWz+vVPf6wYcOYP38+qamprFixQq0iIj5KYUREvO7o0aOVnjdp0oQOHTpQVFTkWRcaGgrA8ePHK207dOhQnE4nL7/8cqX1//jHP7BYLFxxxRXVrmPs2LFs3ryZ+++/H5vNxqhRo2r4SUSkPqjPiIh4XdeuXbn44otJTk4mOjqadevW8dFHHzF58mTPNsnJyQDcfffdDBkyxBMWhg8fzu9+9zsefvhh9uzZQ1JSEl9//TWffvop9957L+3bt692HcOGDSMmJoYPP/yQK664gubNm3v9s4rIuVMYERGvu/vuu/nss8/4+uuvKSoqIiEhgSeffJL777/fs83VV1/NH//4R95//33mzZuHYRiMGjUKq9XKZ599xrRp01i4cCGzZ88mMTGRZ599lj/96U81qsNut3PDDTfw6quv6hKNiA+zGMZJQxqKiDQg9913H2+//Tbp6emEhISYXY6IVEF9RkSkwSosLGTevHlcc801CiIiPkyXaUSkwTl06BDffPMNH330EUePHuWee+4xuyQROQOFERFpcDZv3szo0aNp3rw5L774Ir169TK7JBE5A/UZEREREVOpz4iIiIiYSmFERERETOUXfUZcLhcHDhwgLCxMs22KiIj4CcMwyMnJoWXLllitp2//8IswcuDAAeLj480uQ0RERGohLS2N1q1bn/Z1vwgj5VOJp6WlER4ebnI1IiIiUh3Z2dnEx8d7zuOn4xdhpPzSTHh4uMKIiIiInzlbFwt1YBURERFTKYyIiIiIqRRGRERExFR+0WekOpxOJyUlJWaXIT4kMDAQm81mdhkiInIWDSKM5Obmsm/fPjSyvVRksVho3bo1TZo0MbsUERE5A78PI06nk3379hESEkKzZs00KJoA7oF2Dh8+zL59++jYsaNaSEREfJjfh5GSkhIMw6BZs2YEBwebXY74kGbNmrFnzx5KSkoURkREfFiD6cCqFhE5mX4nRET8Q4MJIyIiIuKfFEZERETEVAojjdyePXuwWCxs3LjxtNu8++67REZG1ltNIiLSuCiMmGTChAmMHDnS7DKq5YYbbmD79u3V2lbBRUREasrv76apLcMwyMwvJrewlJaRwQTalMtOJzg4uN7vVHI6nVgsFqxW/bmIiDR0De5fesMwyC8uPetSUOJk/7ECMrILOZJTVK19zrZ4c9C177//nn79+uFwOGjRogUPPvggpaWlntc/+ugjevToQXBwMDExMQwePJi8vDwAvvvuO/r160doaCiRkZEMGjSI1NTUMx5v165d/O53vyMkJISkpCRSUlI8r53c2rFp0yZ+97vfERYWRnh4OMnJyaxbt47vvvuOiRMnkpWVhcViwWKx8NhjjwFw7Ngxxo0bR1RUFCEhIVxxxRXs2LHjlGN89tlndO3aFYfDwfLlywkMDCQ9Pb1Srffeey+/+c1vavvVioiIj2lwLSMFJU66TvvKlGNvfmIIIfZz/0r379/P0KFDmTBhAnPmzGHr1q3ceuutBAUF8dhjj3Hw4EFuvPFGnnnmGa666ipycnL44YcfMAyD0tJSRo4cya233so///lPiouLWbNmzVlvc3344Yf5+9//TseOHXn44Ye58cYb2blzJwEBp36e0aNH07t3b1577TVsNhsbN24kMDCQgQMHMnPmTKZNm8a2bdsAPKOfTpgwgR07dvDZZ58RHh7OAw88wNChQ9m8eTOBgYEA5Ofn8/TTT/PWW28RExNDfHw87dq1Y+7cudx///2Ae1yZ+fPn88wzz5zz9ywiIr6hwYWRhuDVV18lPj6el19+GYvFQufOnTlw4AAPPPAA06ZN4+DBg5SWlnL11VeTkJAAQI8ePQDIzMwkKyuL3//+97Rv3x6ALl26nPWYf/7znxk2bBgAjz/+ON26dWPnzp107tz5lG337t3L/fff73mtY8eOntciIiKwWCzExcV51pWHkBUrVjBw4EAA5s+fT3x8PJ988gnXXXcd4A4ar776KklJSZ59b7nlFmbPnu0JI59//jmFhYVcf/311fw2RUTE1zW4MBIcaGPzE0Oqta3TZbD1YA4GBufFNsEecG6jdAYHemeUzy1btjBgwIBKrRmDBg3yzMGTlJTEJZdcQo8ePRgyZAiXXXYZ1157LVFRUURHRzNhwgSGDBnCpZdeyuDBg7n++utp0aLFGY/Zs2dPz+PybQ8dOlRlGJkyZQqTJk1i7ty5DB48mOuuu84TfE73eQICAujfv79nXUxMDJ06dWLLli2edXa7vVId4G5ReeSRR1i1ahUXXHAB7777Ltdffz2hoaFn/DwiIuI/GlyfEYvFQog9oFpLWFAgUaF2ggJtuAyqvd/plvoa8dNms7F06VIWL15M165deemll+jUqRO7d+8GYPbs2aSkpDBw4EAWLlzIeeedx6pVq874nuWXSuDEyKUul6vKbR977DF++eUXhg0bxn/+8x+6du3Kxx9/fM6fKzg4+JTvsHnz5gwfPpzZs2eTkZHB4sWLufnmm8/5WCIi4jsaXBipqSYOd+NQbqHT5EpO6NKlCykpKZU6xK5YsYKwsDBat24NuAPDoEGDePzxx/nxxx+x2+2VAkHv3r2ZOnUqK1eupHv37ixYsMCrNZ533nncd999fP3111x99dXMnj0bcLduOJ2Vv8suXbpQWlrK6tWrPeuOHj3Ktm3b6Nq161mPNWnSJBYuXMgbb7xB+/btGTRokFc/i4iImEthpDyMFHn3bpjqyMrKYuPGjZWWtLQ07rzzTtLS0vjjH//I1q1b+fTTT5k+fTpTpkzBarWyevVqnnrqKdatW8fevXtZtGgRhw8fpkuXLuzevZupU6eSkpJCamoqX3/9NTt27KhWv5HqKCgoYPLkyXz33XekpqayYsUK1q5d63n/xMREcnNzWbZsGUeOHCE/P5+OHTsyYsQIbr31VpYvX86mTZsYM2YMrVq1YsSIEWc95pAhQwgPD+fJJ59k4sSJXvkcIiLiQww/kJWVZQBGVlbWKa8VFBQYmzdvNgoKCmr13k6Xy/hp33FjU9oxo6C49FxLrbbx48cbwCnLLbfcYhiGYXz33XdG3759DbvdbsTFxRkPPPCAUVJSYhiGYWzevNkYMmSI0axZM8PhcBjnnXee8dJLLxmGYRjp6enGyJEjjRYtWhh2u91ISEgwpk2bZjidzirr2L17twEYP/74o2fdsWPHDMD49ttvDcMwjNmzZxsRERGGYRhGUVGRMWrUKCM+Pt6w2+1Gy5YtjcmTJ1f6/m+//XYjJibGAIzp06cbhmEYmZmZxtixY42IiAgjODjYGDJkiLF9+3bPPhWPUZVHH33UsNlsxoEDB6r9HZ/r74aIiJybM52/K7IYRj03B9RCdnY2ERERZGVlER4eXum1wsJCdu/eTdu2bQkKCqrV++86nEtukXvws6ZNHN4oWbzslltu4fDhw3z22WfV3scbvxsiIlJ7Zzp/V9Tg7qapjSZBAeQWlZJbWKow4mOysrL46aefWLBgQY2CiIiI+A+FEU70G8krG0W1vu6KkbMbMWIEa9as4fbbb+fSSy81uxwREakDCiO4xwexWS04XQYFJU6vjKIq3vHdd9+ZXYKIiNSxRn83Dbhvkw21n7irRkREROqPwkiZJkHl440ojIiIiNQnhZEy5f1G8ouduHz/BiMREZEGQ2GkjCPASoDVisswyC/2ndFYRUREGjqFkTIWi6XC0PC6VCMiIlJfFEYqaBLknnU3T51YRURE6o3CSAUV+404Xf7XbyQxMZGZM2fW6Xvs2bMHi8XCxo0bz+k4IiIi5RRGKrAH2LDbrBgY5BXXXeuIxWI54/LYY4/V6n3Xrl3LH/7wB+8We5L4+HgOHjxI9+7dz7qtgouIiFSHRvc6SRNHAJn5xeQVlhIeFFgnxzh48KDn8cKFC5k2bRrbtm07UUOTJp7HhmHgdDoJCDj7H1WzZs28W2gVbDYbcXFxdX6ck5WUlBAYWDd/HiIiYq6G1zJiGFCcV+ulibUIS0k+ebnZNd+/mrcEx8XFeZaIiAgsFovn+datWwkLC2Px4sUkJyfjcDhYvnw5v/76KyNGjCA2NpYmTZrQt29fvvnmm0rve/IlFovFwltvvcVVV11FSEgIHTt2rNb8Lvn5+dx8882EhYXRpk0b3njjDc9rJ7d2HDt2jNGjR9OsWTOCg4Pp2LEjs2fPBqBt27YA9O7dG4vFwsUXXwyAy+XiiSeeoHXr1jgcDnr16sWSJUtOOcbChQv57W9/S1BQEG+88Qbh4eF89NFHlWr95JNPCA0NJScnp1rfvYiI+J6G1zJSkg9Ptaz17pFlS608dADsobU+dkUPPvggf//732nXrh1RUVGkpaUxdOhQ/va3v+FwOJgzZw7Dhw9n27ZttGnT5rTv8/jjj/PMM8/w7LPP8tJLLzF69GhSU1OJjo4+7T7PPfccf/3rX3nooYf46KOPuOOOO/jtb39Lp06dTtn20UcfZfPmzSxevJimTZuyc+dOCgoKAFizZg39+vXjm2++oVu3btjtdgBeeOEFnnvuOV5//XV69+7NO++8w5VXXskvv/xCx44dK30Hzz33HL179yYoKIhNmzYxe/Zsrr32Ws825c/DwsJq/B2LiIhvaHgtIw3EE088waWXXkr79u2Jjo4mKSmJ2267je7du9OxY0f++te/0r59+7O2dEyYMIEbb7yRDh068NRTT5Gbm8uaNWvOuM/QoUO588476dChAw888ABNmzbl22+/rXLbvXv30rt3b/r06UNiYiKDBw9m+PDhwInLRjExMcTFxXkC0N///nceeOABRo0aRadOnXj66afp1avXKR1n7733Xq6++mratm1LixYtmDRpEl999ZXnMtehQ4f48ssvufnmm8/6fYqIiO9qeC0jgSHuFopzcDCrgCO5xcSE2mkZGVyzY3tJnz59Kj3Pzc3lscce44svvuDgwYOUlpZSUFDA3r17z/g+PXv29DwODQ0lPDycQ4cOVXuf8ktIp9vnjjvu4JprrmHDhg1cdtlljBw5koEDB572vbOzszlw4ACDBg2qtH7QoEFs2rSp0rqTv4N+/frRrVs33nvvPR588EHmzZtHQkICF1100Rk/j4iI+LaG1zJisbgvlZzDEtIkAiMwhByXo2b7Wixe+xihoZUv9/z5z3/m448/5qmnnuKHH35g48aN9OjRg+Li4jO+z8mdPi0WCy6Xy2v7XHHFFaSmpnLfffdx4MABLrnkEv785z+f8f2r6+TvAGDSpEm8++67gPsSzcSJE7F48XsXEZH61/DCiBeEOmxYgKJSJyWlZz5x15cVK1YwYcIErrrqKnr06EFcXBx79uwxuyzAfTlm/PjxzJs3j5kzZ3o6vJb3EXE6TwyvHx4eTsuWLVmxYkWl91ixYgVdu3Y967HGjBlDamoqL774Ips3b2b8+PFe/CQiImKGhneZxgsCrFaC7DYKip3kFpUSFWA3uyQ6duzIokWLGD58OBaLhUcfffSsLRz1Ydq0aSQnJ9OtWzeKior497//TZcuXQBo3rw5wcHBLFmyhNatWxMUFERERAT3338/06dPp3379vTq1YvZs2ezceNG5s+ff9bjRUVFcfXVV3P//fdz2WWX0bp167r+iCIiUsfUMnIannlqfGRo+Oeff56oqCgGDhzI8OHDGTJkCOeff77ZZWG325k6dSo9e/bkoosuwmaz8f777wMQEBDAiy++yOuvv07L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0PfoHY35ezxTi0g5dWAVERERUymMiIiIiKkadRhxOBxMnz4dh8Nhdil+Td+jd+h79A59j96h79E79D1Wj190YBUREZGGq1G3jIiIiIj5FEZERETEVAojIiIiYiqFERERETGVwoiIiIiYqlGHkVdeeYXExESCgoLo378/a9asMbskvzJjxgz69u1LWFgYzZs3Z+TIkWzbts3ssvze//3f/2GxWLj33nvNLsXv7N+/nzFjxhATE0NwcDA9evRg3bp1ZpflV5xOJ48++iht27YlODiY9u3b89e//vWsE501dv/9738ZPnw4LVu2xGKx8Mknn1R63TAMpk2bRosWLQgODmbw4MHs2LHDnGJ9UKMNIwsXLmTKlClMnz6dDRs2kJSUxJAhQzh06JDZpfmN77//nrvuuotVq1axdOlSSkpKuOyyy8jLyzO7NL+1du1aXn/9dXr27Gl2KX7n2LFjDBo0iMDAQBYvXszmzZt57rnniIqKMrs0v/L000/z2muv8fLLL7NlyxaefvppnnnmGV566SWzS/NpeXl5JCUl8corr1T5+jPPPMOLL77IrFmzWL16NaGhoQwZMoTCwsJ6rtRHGY1Uv379jLvuusvz3Ol0Gi1btjRmzJhhYlX+7dChQwZgfP/992aX4pdycnKMjh07GkuXLjV++9vfGvfcc4/ZJfmVBx54wLjwwgvNLsPvDRs2zLj55psrrbv66quN0aNHm1SR/wGMjz/+2PPc5XIZcXFxxrPPPutZd/z4ccPhcBj//Oc/TajQ9zTKlpHi4mLWr1/P4MGDPeusViuDBw8mJSXFxMr8W1ZWFgDR0dEmV+Kf7rrrLoYNG1bp91Kq77PPPqNPnz5cd911NG/enN69e/Pmm2+aXZbfGThwIMuWLWP79u0AbNq0ieXLl3PFFVeYXJn/2r17N+np6ZX+bkdERNC/f3+dc8r4xay93nbkyBGcTiexsbGV1sfGxrJ161aTqvJvLpeLe++9l0GDBtG9e3ezy/E777//Phs2bGDt2rVml+K3du3axWuvvcaUKVN46KGHWLt2LXfffTd2u53x48ebXZ7fePDBB8nOzqZz587YbDacTid/+9vfGD16tNml+a309HSAKs855a81do0yjIj33XXXXfz8888sX77c7FL8TlpaGvfccw9Lly4lKCjI7HL8lsvlok+fPjz11FMA9O7dm59//plZs2YpjNTABx98wPz581mwYAHdunVj48aN3HvvvbRs2VLfo9SZRnmZpmnTpthsNjIyMiqtz8jIIC4uzqSq/NfkyZP597//zbfffkvr1q3NLsfvrF+/nkOHDnH++ecTEBBAQEAA33//PS+++CIBAQE4nU6zS/QLLVq0oGvXrpXWdenShb1795pUkX+6//77efDBBxk1ahQ9evRg7Nix3HfffcyYMcPs0vxW+XlF55zTa5RhxG63k5yczLJlyzzrXC4Xy5YtY8CAASZW5l8Mw2Dy5Ml8/PHH/Oc//6Ft27Zml+SXLrnkEn766Sc2btzoWfr06cPo0aPZuHEjNpvN7BL9wqBBg065tXz79u0kJCSYVJF/ys/Px2qtfGqw2Wy4XC6TKvJ/bdu2JS4urtI5Jzs7m9WrV+ucU6bRXqaZMmUK48ePp0+fPvTr14+ZM2eSl5fHxIkTzS7Nb9x1110sWLCATz/9lLCwMM+1z4iICIKDg02uzn+EhYWd0s8mNDSUmJgY9b+pgfvuu4+BAwfy1FNPcf3117NmzRreeOMN3njjDbNL8yvDhw/nb3/7G23atKFbt278+OOPPP/889x8881ml+bTcnNz2blzp+f57t272bhxI9HR0bRp04Z7772XJ598ko4dO9K2bVseffRRWrZsyciRI80r2peYfTuPmV566SWjTZs2ht1uN/r162esWrXK7JL8ClDlMnv2bLNL83u6tbd2Pv/8c6N79+6Gw+EwOnfubLzxxhtml+R3srOzjXvuucdo06aNERQUZLRr1854+OGHjaKiIrNL82nffvttlf8ejh8/3jAM9+29jz76qBEbG2s4HA7jkksuMbZt22Zu0T7EYhgaVk9ERETM0yj7jIiIiIjvUBgRERERUymMiIiIiKkURkRERMRUCiMiIiJiKoURERERMZXCiIiIiJhKYURERERMpTAiIiIiplIYEREREVMpjIiIiIip/j9R9OUTSFmosQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"History\")\n",
    "plt.plot(loss_history, label=\"Loss history\")\n",
    "plt.plot(train_history, label=\"Train history\")\n",
    "plt.legend(loc=\"upper left\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T17:12:01.298701Z",
     "iopub.status.busy": "2023-10-31T17:12:01.298421Z",
     "iopub.status.idle": "2023-10-31T17:12:01.303159Z",
     "shell.execute_reply": "2023-10-31T17:12:01.302228Z",
     "shell.execute_reply.started": "2023-10-31T17:12:01.298675Z"
    }
   },
   "outputs": [],
   "source": [
    "test_loader = DataLoader(test_dataset, batch_size=batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T17:12:01.304521Z",
     "iopub.status.busy": "2023-10-31T17:12:01.304249Z",
     "iopub.status.idle": "2023-10-31T17:16:26.743643Z",
     "shell.execute_reply": "2023-10-31T17:16:26.742828Z",
     "shell.execute_reply.started": "2023-10-31T17:12:01.304496Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test accuracy is 0.6918238993710691\n",
      "Test f1 score is 0.6757975051687976\n"
     ]
    }
   ],
   "source": [
    "accuracy, f1 = evaluate_model(gpt, test_loader)\n",
    "print(f\"Test accuracy is {accuracy}\")\n",
    "print(f\"Test f1 score is {f1}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T17:16:57.295133Z",
     "iopub.status.busy": "2023-10-31T17:16:57.294214Z",
     "iopub.status.idle": "2023-10-31T17:16:57.776038Z",
     "shell.execute_reply": "2023-10-31T17:16:57.775094Z",
     "shell.execute_reply.started": "2023-10-31T17:16:57.295097Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>id</th>\n",
       "      <th>sentiment</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Как сообщает пресс-служба акимата Алматы, для ...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Казахстанские авиакомпании перевозят 250 тысяч...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>На состоявшемся под председательством Касым-Жо...</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>В ОАЭ состоялись переговоры между казахстанско...</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>12 вагонов грузового поезда сошли с путей в Во...</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Отправившиеся на «джихад» из города Сатпаева К...</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>\\nНазарбаев утвердил новый состав правительств...</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>ШЫМКЕНТ. КАЗИНФОРМ - В Шардаринском районе Южн...</td>\n",
       "      <td>7</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>С 5 августа 2011 года вступил в юридическую с...</td>\n",
       "      <td>8</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Казахстанцы должны платить за коммунальные усл...</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                text  id  sentiment\n",
       "0  Как сообщает пресс-служба акимата Алматы, для ...   0          0\n",
       "1  Казахстанские авиакомпании перевозят 250 тысяч...   1          0\n",
       "2  На состоявшемся под председательством Касым-Жо...   2          0\n",
       "3  В ОАЭ состоялись переговоры между казахстанско...   3          0\n",
       "4  12 вагонов грузового поезда сошли с путей в Во...   4          0\n",
       "5  Отправившиеся на «джихад» из города Сатпаева К...   5          0\n",
       "6  \\nНазарбаев утвердил новый состав правительств...   6          0\n",
       "7  ШЫМКЕНТ. КАЗИНФОРМ - В Шардаринском районе Южн...   7          0\n",
       "8   С 5 августа 2011 года вступил в юридическую с...   8          0\n",
       "9  Казахстанцы должны платить за коммунальные усл...   9          0"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "articles_test = pd.read_json('data/articles/test.json')\n",
    "articles_test['sentiment'] = pd.Series([0] * len(articles_test), dtype=int)\n",
    "articles_test.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T17:17:10.485361Z",
     "iopub.status.busy": "2023-10-31T17:17:10.485005Z",
     "iopub.status.idle": "2023-10-31T17:17:10.491515Z",
     "shell.execute_reply": "2023-10-31T17:17:10.490438Z",
     "shell.execute_reply.started": "2023-10-31T17:17:10.485332Z"
    }
   },
   "outputs": [],
   "source": [
    "def classify(model, text, tokenizer):\n",
    "    model.eval()\n",
    "    input_ids = tokenizer.encode(text, return_tensors='pt', truncation=True, \n",
    "                                 max_length=2048)\n",
    "    input_ids = input_ids.to(device)\n",
    "    outputs = model(input_ids=input_ids)\n",
    "    logits = torch.mean(outputs.logits, dim=1)\n",
    "    _, indices = torch.max(logits, 1)\n",
    "    return int(indices)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T17:17:35.116602Z",
     "iopub.status.busy": "2023-10-31T17:17:35.115912Z",
     "iopub.status.idle": "2023-10-31T17:19:09.681740Z",
     "shell.execute_reply": "2023-10-31T17:19:09.680446Z",
     "shell.execute_reply.started": "2023-10-31T17:17:35.116568Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>id</th>\n",
       "      <th>sentiment</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Как сообщает пресс-служба акимата Алматы, для ...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Казахстанские авиакомпании перевозят 250 тысяч...</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>На состоявшемся под председательством Касым-Жо...</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>В ОАЭ состоялись переговоры между казахстанско...</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>12 вагонов грузового поезда сошли с путей в Во...</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Отправившиеся на «джихад» из города Сатпаева К...</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>\\nНазарбаев утвердил новый состав правительств...</td>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>ШЫМКЕНТ. КАЗИНФОРМ - В Шардаринском районе Южн...</td>\n",
       "      <td>7</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>С 5 августа 2011 года вступил в юридическую с...</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Казахстанцы должны платить за коммунальные усл...</td>\n",
       "      <td>9</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                text  id  sentiment\n",
       "0  Как сообщает пресс-служба акимата Алматы, для ...   0          1\n",
       "1  Казахстанские авиакомпании перевозят 250 тысяч...   1          2\n",
       "2  На состоявшемся под председательством Касым-Жо...   2          1\n",
       "3  В ОАЭ состоялись переговоры между казахстанско...   3          1\n",
       "4  12 вагонов грузового поезда сошли с путей в Во...   4          0\n",
       "5  Отправившиеся на «джихад» из города Сатпаева К...   5          0\n",
       "6  \\nНазарбаев утвердил новый состав правительств...   6          2\n",
       "7  ШЫМКЕНТ. КАЗИНФОРМ - В Шардаринском районе Южн...   7          2\n",
       "8   С 5 августа 2011 года вступил в юридическую с...   8          1\n",
       "9  Казахстанцы должны платить за коммунальные усл...   9          1"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "articles_test['sentiment'] = articles_test['text']\\\n",
    "    .apply(lambda text: classify(gpt, text, tokenizer))\n",
    "articles_test.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T17:21:16.503378Z",
     "iopub.status.busy": "2023-10-31T17:21:16.502509Z",
     "iopub.status.idle": "2023-10-31T17:21:16.516094Z",
     "shell.execute_reply": "2023-10-31T17:21:16.515232Z",
     "shell.execute_reply.started": "2023-10-31T17:21:16.503340Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>id</th>\n",
       "      <th>sentiment</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Как сообщает пресс-служба акимата Алматы, для ...</td>\n",
       "      <td>0</td>\n",
       "      <td>neutral</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Казахстанские авиакомпании перевозят 250 тысяч...</td>\n",
       "      <td>1</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>На состоявшемся под председательством Касым-Жо...</td>\n",
       "      <td>2</td>\n",
       "      <td>neutral</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>В ОАЭ состоялись переговоры между казахстанско...</td>\n",
       "      <td>3</td>\n",
       "      <td>neutral</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>12 вагонов грузового поезда сошли с путей в Во...</td>\n",
       "      <td>4</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Отправившиеся на «джихад» из города Сатпаева К...</td>\n",
       "      <td>5</td>\n",
       "      <td>negative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>\\nНазарбаев утвердил новый состав правительств...</td>\n",
       "      <td>6</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>ШЫМКЕНТ. КАЗИНФОРМ - В Шардаринском районе Южн...</td>\n",
       "      <td>7</td>\n",
       "      <td>positive</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>С 5 августа 2011 года вступил в юридическую с...</td>\n",
       "      <td>8</td>\n",
       "      <td>neutral</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Казахстанцы должны платить за коммунальные усл...</td>\n",
       "      <td>9</td>\n",
       "      <td>neutral</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                text  id sentiment\n",
       "0  Как сообщает пресс-служба акимата Алматы, для ...   0   neutral\n",
       "1  Казахстанские авиакомпании перевозят 250 тысяч...   1  positive\n",
       "2  На состоявшемся под председательством Касым-Жо...   2   neutral\n",
       "3  В ОАЭ состоялись переговоры между казахстанско...   3   neutral\n",
       "4  12 вагонов грузового поезда сошли с путей в Во...   4  negative\n",
       "5  Отправившиеся на «джихад» из города Сатпаева К...   5  negative\n",
       "6  \\nНазарбаев утвердил новый состав правительств...   6  positive\n",
       "7  ШЫМКЕНТ. КАЗИНФОРМ - В Шардаринском районе Южн...   7  positive\n",
       "8   С 5 августа 2011 года вступил в юридическую с...   8   neutral\n",
       "9  Казахстанцы должны платить за коммунальные усл...   9   neutral"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "articles_test['sentiment'] = articles_test['sentiment']\\\n",
    "    .map({v: k for k, v in sentiment_map.items()})\n",
    "articles_test.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T17:21:26.867843Z",
     "iopub.status.busy": "2023-10-31T17:21:26.867119Z",
     "iopub.status.idle": "2023-10-31T17:21:26.880071Z",
     "shell.execute_reply": "2023-10-31T17:21:26.879334Z",
     "shell.execute_reply.started": "2023-10-31T17:21:26.867805Z"
    }
   },
   "outputs": [],
   "source": [
    "articles_test[['id', 'sentiment']].to_csv('output.csv', index=False)"
   ]
  },
  {
   "attachments": {
    "24ae0bd0-05d3-40d7-a4af-4768264f7d2f.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+EAAAC6CAYAAADBGExPAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAFCfSURBVHhe7d0PQFRlojf+r5ZMt9UpzSlNsgLbFrqbUBuwu4JtKpWorYh3BboJ1ovim392899dkN0FbAXcXbP9+e8W0L4C3hXcm6AlaAW0K9B7Hdx3HbpXh0oxzVHMkVqHtPk9zzlnhplh+KPCiNv3c++JOX/mnOc854x7vvM858wgu4BuyNlffXUJtvZ22GzaIF5fvvy1tgQRERERERHRN8tNNw2Gzs8POp02iNdDhtyMQYMGaUt4120IP9v6Oc6fv4DBXlZ+8803aUsRERERERERfbNcunTZa2P17bcNwx0jbteW6sxrCG9v/wonP7Ng6LduxfDb9Rg8eLA2h4iIiIiIiIi8+frrr3HucyvavvgSd48yYMiQIdqcDp1CeOu587BeaMPouwxKqzcRERERERER9Z5sGf/0lAW33zYUw2+/TZuqcgvhx0+cwj/dosPIO4ZrU4iIiIiIiIjoaljOnFO6qfvffZc2xSWEywB+27Ch0OuHKjOIiIiIiIiI6Nqct17AhQtfwH/MKGVcudlbdkGXLeAM4ERERERERER95zb9MOVWb3mvuDRYPoRN3gPOLuhEREREREREfc8wcgQ+P29Vfv570MfHTthH3TmSD2EjIiIiIiIi6ifyYW2nTp/BYPkzZAzgRERERERERP1H5u5v3XorBl2+fNnO3wEnIiIiIiIi6l/yd8Q7/U44EREREREREfUPNoETERERERER+QhDOBEREREREZGPMIQTERERERER+QhDOBEREREREZGPMIQTERERERER+QhDOBEREREREZGPMIQTERERERER+QhDOBEREREREZGPMIQTERERERER+QhDOBEREREREZGPMIQTERERERER+QhDOBEREREREZGPMIQTERERERER+QhDOBEREREREZGPMIQTERERERER+QhDOBEREREREZGPMIQTERERERER+cggu6C97nM2qxU26KDX67Qpgs0Kq81zWgtMxhOwGQIQHGgQ7+igrEOnR8fiNlitYq16vbqcsj5lhsI53ZsellXL68qjnGKuxdwEs8UP/qHB8Hd/s9u6Jfcyuq/Lfb/UferEbb89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QKx47/1ifmR6C+I2L0N0p3yrQ0TCYozxm4N5nWd6CMa8LWnAK7J7vFhvSCrqIjZipfY+ffQybJnYiEUh6jYn59qwekuS9kVLZ8Gp21Ayq9mtrtfty0KE99QO/7hMrIny08aIiIiIiIgGrn79nfC+ZYPNpoPWuEqSbL7upkJsYr7O1xUmtmkT2+xqqz0UmYiIiIiI6B/aDRTCiYiIiIiIiG5s17c7OhEREREREdE3CEM4ERERERERkY8whBMRERERERH5CEM4ERERERERkY8whBMRERERERH5CEM4ERERERERkY8whBMRERERERH5CEM4ERERERERkY8whBMRERERERH5CEM4ERERERERkY8whBMRERERERH5CEM4ERERERERkY8whBMRERERERH5CEM4ERERERERkY8whBMRERERERH5CEM4ERERERERkY8whBMRERERERH5CEM4ERERERERkY8whBMRERERERH5CEM4ERERERERkY8whBMRERERERH5yCC7oL0eEM5/fBh1//0Oqj9uhNl2DHWX27U5IxChG4tAwxOYGBqGieNG4xZtDhEREREREdGNYGCE8EsXcPhAITYZd6HcGbp7MgLT/Vdh5fRw3MM0TkRERERERDeA6x7Cz//3Dizb83tUauNXbiiigzfi35+8VxsnIiIiIiIiGpiuYwi34fCupZhrNsGiTZEMNwUj2n8Goh8OQejo0bjtW9qMSzactxyD8fDbKDe9jdLLbdoMleHWn2H7/GcwThuna2WDubwEpU3i6IyZgtTEEOi1OURERERE32hWM6rLC1FUfAgtYtQ/NB6JyTGYGHiDXzFb6lH0itgv4wmxU+PFPi1GYoRBm9kN1/rQB2DirCTMiwuB2zutjSjaXKXUVych8VgZ7a+NSD1kEbf6H4bAifFIXTANwV6q32IsQ37BTlSbL0AfGIm45CTEhfZin/rRdQrhNhzc8QJmthzTxqUQrPzei0j8/gO47WZtUjfOH30L6yt/i3ybS/d1XQr2LEzEQ9rowGdB5fLnsd4UhKWFOYjut3OhEfkxGShFLNbsTkKoNrVL4sO3aXEqcusvqONRa9FQOMv9Q0RERERE9A1kM+ZhZvxWNHW6i9YPUbl78Uaca5i8cdiM2Zg66w00a+MOAck7sGd1CHTaeCctVViWtBBlHm/0C0rB9p3LEep4Y0sZ5kSt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JTXlsy7q11FnYv1tL/4aP+6mGz8RERH1Pdkt3FD8JB4c/wgeW25BsPtvMYvrLB1ylFbXJzEh64LS/brLDC74J67HSmsGJkyW7/k+5tTMwro4x289OeiVLual8d9XW3QnL4QxOQ3RMu74x+PVFReQFvmkMu+x+BrE5cUqvxblue6ZZVHYvjq849rUlS4cGSWB2DRZ20bYbBSNiUGo3IYIzJviE5Hv5YFxYitI3LAM1vTHMUluP3YnJpakI0JupGUf0hLWoFrJ1sFILYyHcf731eXCMmBd8bqzm3jwvNcRXT8bj8myhn0fadZleDVRrQd9dBrWIE/kELnvj2Cq637opyAjz4D1kY8o650a9iRybGL5ODUL6lyfqK43QCefzG7Qe6+DPjRI3hiuvb4hXLp0CR8fOyFC9F1KF/UrIVvAPz1lwX1j78bNV9QNvTPZXbfdb6jWcntlbG3t0F37TbVXRJbX+z2wsos9vP4kl1ftbbCJ/fZcj+39bPy4YTrecnQnvirdl6XrfbheuiuvmNfu18X50d28PiCOkbL+qznHuji+/UqWF94+S1dwbna5joGnV5//Xu3PKex5YQ2Q7d6tfeB9ToiIiMidDbJXur67fuieZJdrEbZ7eotNXbGX64ButtnLdTt0vY3u2aw2EXp78S6bCPNd3GMuy2rTdbVtsY82XZf7cbXl7g83XAiXLl/+Gic/Ow2/IX6409C77pbyHnDZBV22gA8efEN1ABjgjuHwrg/wZmEFgtcXsOWNqL+07sUv5+zEqJ8txCTxOfvknY141TQN+c7nChARERHRjeCGDOEOn5+34ssvL2LQoEHK730rg5/adGRrb1d+B1wOchflQ9iu+B5w6ln7KRxuPA6/sY/hAc+HTBFR32o7BuM7lag/2oZRwdGIfCqYAZyIiIjoBnNDh3Dpq68u4aLN5gzcMnxLMow7gvk/3aK75u7nRERERERERNfqhg/hRERERERERDcK3hxNRERERERE5CMM4UREREREREQ+whBORERERERE5CMM4UREREREREQ+whBORERERERE5CMM4UREREREREQ+whBORERERERE5CMM4UREREREREQ+whBORERERERE5CMM4UREREREREQ+whBORERERERE5CMM4UREREREREQ+whBORERERERE5CMM4UREREREREQ+whBORERERERE5CMM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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image.png](attachment:24ae0bd0-05d3-40d7-a4af-4768264f7d2f.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-10-31T17:22:51.556463Z",
     "iopub.status.busy": "2023-10-31T17:22:51.555688Z",
     "iopub.status.idle": "2023-10-31T17:22:52.377236Z",
     "shell.execute_reply": "2023-10-31T17:22:52.376441Z",
     "shell.execute_reply.started": "2023-10-31T17:22:51.556426Z"
    }
   },
   "outputs": [],
   "source": [
    "torch.save(gpt, 'lt_sberbank-gpt-sentiment-classifier.pth')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
